/*
 * InvertedListSerializer.h
 *
 *  Created on: Nov 29, 2012
 *      Author: m
 */

#ifndef INVERTEDLISTSERIALIZER_H_
#define INVERTEDLISTSERIALIZER_H_

#include <vector>
#include "Serializer.h"
#include "../file_system/InvertedList.h"

namespace physical
{

/**
 * Serializador de InvertedList (aka vector<unsigned short>)
 */
class InvertedListSerializer: public physical::Serializer< InvertedList >
{
public:

    /**
     * Constructor
     */
    InvertedListSerializer();

    /**
     * Destructor
     */
    virtual ~InvertedListSerializer();
    ;

    /**
     * Serializa un Elemento
     *
     * @param element Elemento a serializar
     * @param block Array de bytes en donde se serializa el elemento
     * @return Cantidad de bytes escritos en el block
     */
    virtual size_t serialize( const InvertedList& element, byteStream block );

    /**
     * Deserializa un Elemento
     *
     * @param block Array de bytes donde está serializado el elemento
     * @param element Referencia al elemento deserializado
     * @return Cantidad de bytes utilizados de block para deserializar
     */
    virtual size_t deserialize( const byteStream block, InvertedList& element );

    /**
     * Devuelve la cantidad de bytes que ocupa el elemento al ser serializado
     *
     * @param element Elemento a probar
     * @return Cantidad de bytes que ocuparía el elemento serializado
     */
    virtual size_t getSize( const InvertedList& element );

protected:
    typedef unsigned short invertedListElement_t;
};

/*************************************************************
 **********************   Exepciones   **********************
 *************************************************************/

/**
 * Excepción Genérica de Serializer
 */
class InvertedListSerializerException : public SerializerException
{
};

/**
 * Excepción: Intentando realizar operación I/O en BlockFile con
 *  tamaño cero o menor
 */
class InvalidSizeException: public InvertedListSerializerException
{
  virtual const char* what() const throw()
  {
    return "Inverted List size should be greater than 0.";
  }
};

} /* namespace physical */
#endif /* INVERTEDLISTSERIALIZER_H_ */
